package com.cskaoyan.javase.basic._2variable._3detail;

/**
 * 变量使用的细节问题一: 浮点数的精度问题
 * 浮点数之所以存在精度问题,原因有两个:
 *      1.因为浮点数本身位数有限,尾数的长度是固定的
 *          所以能表示的有效数字有限,精度有限
 *      2.二进制表示小数可能出现无限的情况.
 *
 * 比如用二进制表示十进制小数"0.1"
 * 这里涉及一个二进制表示小数的转换问题，规则如下：
 * 十进制正小数（0.开头）转换成二进制
 * 先用小数部分乘以2，取结果的整数部分(必然是1或者0)，
 * 然后小数部分继续乘2
 * 直到小数部分为0，或者已经达到了最大的位数
 * 最终的结果（0.开头）正序排列
 *
 * 0.1 * 2 = 0.2 --> 0
 * 0.2 * 2 = 0.4 --> 0
 * 0.4 * 2 = 0.8 --> 0
 * 0.8 * 2 = 1.6 --> 1
 * 0.6 * 2 = 1.2 --> 1
 * 0.2 * 2 = 0.4 --> 0
 * 0.4 * 2 = 0.8 --> 0
 * ...
 * 以上是一个循环的过程,也就是说,用二进制表示小数0.1是一个无限循环小数
 *
 *
 * @since 16:35
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        System.out.println(1 - 0.9);
        System.out.println(1 - 0.9F);
        float f = 0.1F;
        double d = 0.1;
        System.out.println(f == d);
    }
}
